<#assign import_block>
import CodeListService from "@service/app/codelist-service";
import { FormItemModel } from '@/model/form-detail';
</#assign>
<#ibizinclude>
../@MACRO/CONTROL/CONTROL_HEADER-BASE.vue.ftl
</#ibizinclude>

    /**
     * 代码表服务对象
     *
     * @type {CodeListService}
     * @memberof ${srfclassname(ctrl.codeName)}
     */  
    public codeListService:CodeListService = new CodeListService({ $store: this.$store });

    /**
     * 获取多项数据
     *
     * @returns {any[]}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public getDatas(): any[] {
        return this.selections;
    }

    /**
     * 获取单项树
     *
     * @returns {*}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public getData(): any {
        return this.selections[0];
    }

<#if view.getPSAppViewLogics?? && view.getPSAppViewLogics()??>
  <#list view.getPSAppViewLogics() as logic>
    <#if logic.getPFLogicCodeType() == 'APP_NEWDATA'>
    /**
     * 打开新建数据视图
     *
     * @type {any}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    @Prop() public newdata: any;
    </#if>
    <#if logic.getPFLogicCodeType() == 'APP_OPENDATA'>
    /**
     * 打开编辑数据视图
     *
     * @type {any}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    @Prop() public opendata: any;
    </#if>
  </#list>
</#if>

    /**
     * 显示处理提示
     *
     * @type {boolean}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    @Prop({ default: true }) public showBusyIndicator?: boolean;

    /**
     * 部件行为--update
     *
     * @type {string}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    @Prop() public updateAction!: string;
    
    /**
     * 部件行为--fetch
     *
     * @type {string}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    @Prop() public fetchAction!: string;
    
    /**
     * 部件行为--remove
     *
     * @type {string}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    @Prop() public removeAction!: string;
    
    /**
     * 部件行为--load
     *
     * @type {string}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    @Prop() public loadAction!: string;
    
    /**
     * 部件行为--loaddraft
     *
     * @type {string}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    @Prop() public loaddraftAction!: string;
    
    /**
     * 部件行为--create
     *
     * @type {string}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    @Prop() public createAction!: string;

    /**
     * 当前页
     *
     * @type {number}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public curPage: number = 1;

    /**
     * 数据
     *
     * @type {any[]}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public items: any[] = [];

    /**
     * 是否支持分页
     *
     * @type {boolean}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public isEnablePagingBar: boolean = ${ctrl.isEnablePagingBar()?c};

    /**
     * 是否禁用排序
     *
     * @type {boolean}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public isNoSort: boolean = ${ctrl.isNoSort()?c};

    /**
     * 排序方向
     *
     * @type {string}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public minorSortDir: string = '<#if ctrl.getMinorSortDir()??>${ctrl.getMinorSortDir()}</#if>';

    /**
     * 排序字段
     *
     * @type {string}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public minorSortPSDEF: string = '<#if ctrl.getMinorSortPSDEF()??>${ctrl.getMinorSortPSDEF().getCodeName()?lower_case}</#if>';

    /**
     * 分页条数
     *
     * @type {number}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public limit: number = ${ctrl.getPagingSize()?c};

    /**
     * 是否显示标题
     *
     * @type {boolean}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public isHideHeader: boolean = ${ctrl.isHideHeader()?c};

    /**
     * 是否默认选中第一条数据
     *
     * @type {boolean}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    @Prop({ default: false }) public isSelectFirstDefault!: boolean;

    /**
     * 是否单选
     *
     * @type {boolean}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    @Prop() public isSingleSelect?: boolean;

    /**
     * 选中数据字符串
     *
     * @type {string}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    @Prop() public selectedData?: string;

    /**
     * 动态代码表集合
     *
     * @type {*}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public dCodeList: any = {};

    /**
     * 选中值变化
     *
     * @param {*} newVal
     * @param {*} oldVal
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    @Watch('selectedData')
    public onValueChange(newVal: any, oldVal: any) {
        this.selections = [];
        if(this.selectedData){
            const refs: any = this.$refs;
            if (refs.multipleTable) {
                refs.multipleTable.clearSelection();
                JSON.parse(this.selectedData).forEach((selection:any)=>{
                    let selectedItem = this.items.find((item:any)=>{
                        return Object.is(item.srfkey, selection.srfkey);
                    });
                    if(selectedItem){
                        this.rowClick(selectedItem);
                    }
                });
            }
        }
    }

    /**
     * 表格行数据默认激活模式
     * 0 不激活
     * 1 单击激活
     * 2 双击激活
     *
     * @type {(number | 0 | 1 | 2)}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    @Prop({default: 2}) public gridRowActiveMode!: number;

    /**
     * 是否开启行编辑
     *
     * @type {boolean}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    @Prop({default: false}) public isOpenEdit!: boolean;

    /**
     * 实际是否开启行编辑
     *
     * @type {boolean}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public actualIsOpenEdit: boolean = this.isOpenEdit;

    /**
     * 总条数
     *
     * @type {number}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public totalrow: number = 0;

    /**
     * 选中行数据
     *
     * @type {any[]}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public selections: any[] = [];

    /**
     * 拦截行选中
     *
     * @type {boolean}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public stopRowClick: boolean = false;

    <#if ctrl.getAggMode() == "ALL">
    /**
     * 表格聚合行为
     *
     * @type {string}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public aggAction:string ='<#if ctrl.getAggPSDEAction()??>${ctrl.getAggPSDEAction().getCodeName()}</#if>';

    /**
     * 远程数据
     *
     * @type {any}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public remoteData:any = {};
    </#if>

    <#if ctrl.getQuickPSDEToolbar?? && ctrl.getQuickPSDEToolbar()??>
      <#assign quickToolbar = ctrl.getQuickPSDEToolbar()/>
      ${P.getCtrlCode(quickToolbar, 'CONTROL.vue').code}
    </#if>

    <#if ctrl.getBatchPSDEToolbar?? && ctrl.getBatchPSDEToolbar()??>
      <#assign batchToolbar = ctrl.getBatchPSDEToolbar()/>
      ${P.getCtrlCode(batchToolbar, 'CONTROL.vue').code}
    </#if>

    /**
     * 表格是否显示
     *
     * @type {boolean}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public isDisplay:boolean = <#if ctrl.getAggMode() == "ALL">false<#else>true</#if>;

    /**
     * 部件刷新
     *
     * @param {any[]} args
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public refresh(args: any[]): void {
        this.load();
    }

    /**
    * 选项框列宽
    *
    * @type {number}
    * @memberof ${srfclassname(ctrl.codeName)}
    */
    public checkboxColWidth: number = <#if app.getPSApplicationUI()??>${app.getPSApplicationUI().getPFStyleParam('EL-TABLE.CHECKCOLWIDTH', 35)}<#else>35</#if>;

    /**
     * 是否允许拖动列宽
     *
     * @type {boolean}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public isDragendCol: boolean = <#if app.getPSApplicationUI()??>${app.getPSApplicationUI().getPFStyleParam('EL-TABLE.ISDRAGENDCOL',false)?c}<#else>false</#if>;
    <#--  public isDragendCol: boolean = true;  -->

    /**
     * 所有列成员
     *
     * @type {any[]}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public allColumns: any[] = [
        <#if ctrl.getAllPSDEGridColumns()??>
        <#list ctrl.getAllPSDEGridColumns() as column>
        {
            name: '${column.getName()?lower_case}',
            label: '${column.getCaption()}',
            langtag: '<#if langbase??>${langbase}.columns.${column.getName()?lower_case}</#if>',
            show: <#if column.isHideDefault()>false<#else>true</#if>,
            util: '${column.getWidthUnit()}',
            render: (val: any) => {
                return this.renderColValue('${column.getName()?lower_case}', val);
            }
        },
        </#list>
        </#if>
    ]

    /**
     * 表格模型集合
     *
     * @type {*}
     * @memberof ${srfclassname('${ctrl.codeName}')}
     */
    public gridItemsModel: any[] = [];

    /**
     * 绘制列值
     *
     * @type {*}
     * @memberof PivotTable
     */
    public renderColValue(name: string, value: any) {
        <#if ctrl.getAllPSDEGridColumns()??>
        <#list ctrl.getAllPSDEGridColumns() as column>
        <#if column.render?? || (column.getCodeList()?? && column.getCLConvertMode() == 'FRONT')>
        if(Object.is('${column.getName()?lower_case}', name)) {
            <#if column.render??>
            ${item.render.code}
            <#elseif column.getCodeList()?? && column.getCLConvertMode() == 'FRONT'>
            <#assign codelist = column.getPSCodeList()>
            <#if codelist.getCodeListType() == 'STATIC'>
            let codelist: any[] = this.$store.getters.getCodeList('${codelist.getCodeName()}');
            if(codelist) {
                return this.getCodeListItem(codelist, value);
            }
            <#elseif codelist.getCodeListType() == 'DYNAMIC'>
            let items = this.dCodeList['${codelist.getCodeName()}'];
            if(items) {
                for(let i = 0; i < items.length; i++) {
                    if(Object.is(items[i].value, value)) {
                        return items[i].text;
                    }
                }
            }
            </#if>
            </#if>
        }
        </#if>
        </#list>
        </#if>
        return value;
    }

    /**
     * 获取代码项
     *
     * @public
     * @memberof ${srfclassname('${ctrl.codeName}')}
     */
    public getCodeListItem(codelist: any, val: any) {
        for(let i = 0; i < codelist.items.length; i++) {
            if(Object.is(codelist.items[i].value, val)) {
                return codelist.items[i].text;
            }
        }
        return codelist.emptytext;
    }

    /**
     * 准备动态代码表数据集合
     *
     * @memberof ${srfclassname('${ctrl.codeName}')}
     */
    public async readyDCodelist() {
        <#assign num = 0>
        let keys: string[] = [
            <#if ctrl.getAllPSDEGridColumns()??>
            <#list ctrl.getAllPSDEGridColumns() as column>
            <#if column.getCodeList()?? && column.getCLConvertMode() == 'FRONT'>
            <#assign codelist = column.getPSCodeList()>
            <#if codelist.getCodeListType() == 'DYNAMIC'>
            <#if num gt 0>,</#if>'${codelist.getCodeName()}'<#assign num = num + 1>
            </#if>
            </#if>
            </#list>
            </#if>
        ];
        for (let key of keys) {
            let items = await this.codeListService.getItems('UserRealName');
            this.dCodeList[key] = items;
        }
        
    }

    /**
     * 获取表格行模型
     *
     * @type {*}
     * @memberof ${srfclassname('${ctrl.codeName}')}
     */
    public getGridRowModel(){
        return {
<#list ctrl.getPSDEGridEditItems() as edititem>
          ${edititem.getName()}: new FormItemModel(),
</#list>
        }
    }

    /**
     * 属性值规则
     *
     * @type {*}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public rules(){
        return {
        <#list ctrl.getPSDEGridEditItems() as edititem>
        ${edititem.getName()}: [
             { required: <#if edititem.isAllowEmpty()>false<#else>true</#if>, validator: (rule:any, value:any, callback:any) => { return (rule.required && (value === null || value === undefined || value === "")) ? false : true;}, message: <#if edititem.getCaption?? && edititem.getCaption()??>'${edititem.getCaption()} 值不能为空'<#else>'值不能为空'</#if>, trigger: 'change' },
            { required: <#if edititem.isAllowEmpty()>false<#else>true</#if>, validator: (rule:any, value:any, callback:any) => { return (rule.required && (value === null || value === undefined || value === "")) ? false : true;}, message: <#if edititem.getCaption?? && edititem.getCaption()??>'${edititem.getCaption()} 值不能为空'<#else>'值不能为空'</#if>, trigger: 'blur' },
          <#if ctrl.getPSDEGridEditItemVRs?? && ctrl.getPSDEGridEditItemVRs()??>
            <#list ctrl.getPSDEGridEditItemVRs() as fideValueRule>
              <#if fideValueRule.getPSDEGridEditItemName() == edititem.getName()>
                <#if fideValueRule.getPSSysValueRule()??>
                  <#assign  valueRule = fideValueRule.getPSSysValueRule()/>
                  <#if valueRule.getRuleType?? && valueRule.getRuleType()??>
                    <#if valueRule.getRuleType() == "REG">
            { <#if valueRule.getRegExCode?? && valueRule.getRegExCode()??>pattern: /^${valueRule.getRegExCode()}$/</#if><#if valueRule.getRuleInfo?? &&  valueRule.getRuleInfo()??>, message: '${valueRule.getRuleInfo()}'</#if>, trigger: 'change' },
                    <#elseif valueRule.getRuleType() == "SCRIPT">
            { <#if valueRule.getScriptCode?? && valueRule.getScriptCode()??>validator: (rule:any, value:any, callback:any) => { ${valueRule.getScriptCode()} }</#if><#if valueRule.getRuleInfo?? &&  valueRule.getRuleInfo()??>, message: '${valueRule.getRuleInfo()}'</#if>, trigger: 'change' },
                    </#if>
                  </#if>
                </#if>
              </#if>
            </#list>
          </#if>
        ],
        </#list>
        }
    }

    /**
     * 表格行编辑项校验
     *
     * @param {string} property 属性名
     * @param {*} data 行数据
     * @param {number} rowIndex 行索引
     * @returns Promise<any>
     * 
     * @memberof ${srfclassname('${ctrl.codeName}')}
     */
    public validate(property:string, data:any, rowIndex:number):Promise<any>{
        return new Promise((resolve, reject) => {
            this.$util.validateItem(property,data,this.rules() as any).then(()=>{
                this.gridItemsModel[rowIndex][property].setError(null);
                resolve(true);
            }).catch((res: any) => {
                this.gridItemsModel[rowIndex][property].setError(res.errors[0].message);
                resolve(false);
            });
        });
    }

    /**
     * 校验所有修改过的编辑项
     *
     * @returns Promise<any>
     * @memberof ${srfclassname('${ctrl.codeName}')}
     */
    public async validateAll(){
        let validateState = true;
        let index = -1;
        for(let item of this.items){
          index++;
          if(item.rowDataState === "create" || item.rowDataState === "update"){
            for(let property of Object.keys(this.rules() as any)){
              if(!await this.validate(property,item,index)){
                validateState = false;
              }
            }
          }
        }
        return validateState;
    }

    /**
     * 表格数据加载
     *
     * @param {*} [arg={}]
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public load(opt: any = {}, pageReset: boolean = false): void {
        if(!this.fetchAction){
            this.$Notice.error({ title: '错误', desc: '${view.getName()}视图表格fetchAction参数未配置' });
            return;
        }
        if(pageReset){
            this.curPage = 1;
        }
        const arg: any = {...opt};
        const page: any = {};
        if (this.isEnablePagingBar) {
            Object.assign(page, { page: this.curPage-1, size: this.limit });
        }
        // 设置排序
        if (!this.isNoSort && !Object.is(this.minorSortDir, '') && !Object.is(this.minorSortPSDEF, '')) {
            const sort: string = this.minorSortPSDEF+","+this.minorSortDir;
            Object.assign(page, { sort: sort });
        }
        Object.assign(arg, page);
        const parentdata: any = {};
        this.$emit('beforeload', parentdata);
        Object.assign(arg, parentdata);
        let tempViewParams:any = parentdata.viewparams?parentdata.viewparams:{};
        Object.assign(tempViewParams,JSON.parse(JSON.stringify(this.viewparams)));
        Object.assign(arg,{viewparams:tempViewParams});
        const post: Promise<any> = this.service.search(this.fetchAction,JSON.parse(JSON.stringify(this.context)), arg, this.showBusyIndicator);
        post.then((response: any) => {
            if (!response.status || response.status !== 200) {
                if (response.errorMessage) {
                    this.$Notice.error({ title: '错误', desc: response.errorMessage });
                }
                return;
            }
            const data: any = response.data;
            this.totalrow = response.total;
            this.items = JSON.parse(JSON.stringify(data));
            // 清空selections,gridItemsModel
            this.selections = [];
            this.gridItemsModel = [];
            this.items.forEach(()=>{this.gridItemsModel.push(this.getGridRowModel())});
            this.$emit('load', this.items);
            // 设置默认选中
            let _this = this;
            setTimeout(() => {
                if(_this.isSelectFirstDefault){
                  _this.rowClick(_this.items[0]);
                }
                if(_this.selectedData){
                    const refs: any = _this.$refs;
                    if (refs.multipleTable) {
                        refs.multipleTable.clearSelection();
                        JSON.parse(_this.selectedData).forEach((selection:any)=>{
                            let selectedItem = _this.items.find((item:any)=>{
                                return Object.is(item.srfkey, selection.srfkey);
                            });
                            if(selectedItem){
                                _this.rowClick(selectedItem);
                            }
                        });
                    }
                }
            }, 300);
            <#if ctrl.getAggMode() == "ALL">
            this.getAggData();
            </#if>
        }).catch((response: any) => {
            if (response && response.status === 401) {
                return;
            }
            this.$Notice.error({ title: '错误', desc: response.errorMessage });
        });
    }

    /**
     * 删除
     *
     * @param {any[]} datas
     * @returns {Promise<any>}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public async remove(datas: any[]): Promise<any> {
        if(!this.removeAction){
            this.$Notice.error({ title: '错误', desc: '${view.getName()}视图表格removeAction参数未配置' });
            return;
        }
        let _datas:any[] = [];
        datas.forEach((record: any, index: number) => {
            if (!record.srfkey) {
                this.items.some((val: any, num: number) =>{
                    if(JSON.stringify(val) == JSON.stringify(record)){
                        this.items.splice(num,1);
                        this.gridItemsModel.splice(num,1);
                        return true;
                    }
                }); 
            }else{
               _datas.push(datas[index]);
            }
        });
        if (_datas.length === 0) {
            return;
        }
        let dataInfo = '';
        _datas.forEach((record: any, index: number) => {
            let srfmajortext = record.${ctrl.getPSAppDataEntity().getMajorPSAppDEField().getCodeName()?lower_case};
            if (index < 5) {
                if (!Object.is(dataInfo, '')) {
                    dataInfo += '、';
                }
                dataInfo += srfmajortext;
            } else {
                return false;
            }
        });

        if (_datas.length < 5) {
            dataInfo = dataInfo + ' 共' + _datas.length + '条数据';
        } else {
            dataInfo = dataInfo + '...' + ' 共' + _datas.length + '条数据';
        }

        const removeData = () => {
            let keys: any[] = [];
            _datas.forEach((data: any) => {
                keys.push(data.srfkey);
            });
            let _removeAction = keys.length > 1 ? 'removeBatch' : this.removeAction ;
            let _keys = keys.length > 1 ? keys : keys[0] ;
            const context:any = JSON.parse(JSON.stringify(this.context));
            const post: Promise<any> = this.service.delete(_removeAction,Object.assign(context,{ ${ctrl.getPSAppDataEntity().codeName?lower_case}: _keys }),Object.assign({ ${ctrl.getPSAppDataEntity().codeName?lower_case}: _keys },{viewparams:this.viewparams}), this.showBusyIndicator);
            return new Promise((resolve: any, reject: any) => {
                post.then((response: any) => {
                    if (!response || response.status !== 200) {
                        this.$Notice.error({ title: '', desc: '删除数据失败,' + response.info });
                        return;
                    } else {
                        this.$Notice.success({ title: '', desc: '删除成功!' });
                    }
                    //删除items中已删除的项
                    console.log(this.items);
                    _datas.forEach((data: any) => {
                      this.items.some((item:any,index:number)=>{
                        if(Object.is(item.srfkey,data.srfkey)){
                                this.items.splice(index,1);
                                this.gridItemsModel.splice(index,1);
                                return true;
                            }
                        });
                    });
                    this.totalrow -= _datas.length;
                    this.$emit('remove', null);
                    this.selections = [];
                    resolve(response);
                }).catch((response: any) => {
                    if (response && response.status === 401) {
                        return;
                    }
                    if (!response || !response.status || !response.data) {
                        this.$Notice.error({ title: '错误', desc: '系统异常' });
                        reject(response);
                        return;
                    }
                    reject(response);
                });
            });
        }

        dataInfo = dataInfo.replace(/[null]/g, '').replace(/[undefined]/g, '');
        this.$Modal.confirm({
            title: '警告',
            content: '确认要删除 ' + dataInfo + '，删除操作将不可恢复？',
            onOk: () => {
                removeData();
            },
            onCancel: () => { }
        });
        return removeData;
    }


    /**
     * 批量添加
     *
     * @param {*} [arg={}]
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public addBatch(arg: any = {}): void {
        if(!this.fetchAction){
            this.$Notice.error({ title: '错误', desc: '${view.getName()}视图表格fetchAction参数未配置' });
            return;
        }
        if(!arg){
            arg = {};
        }
        console.error("批量添加未实现");
        <#--  const post: Promise<any> = this.$http.post(this.fetchAction, arg, this.showBusyIndicator);
        post.then((response: any) => {
            if (response.ret !== 200) {
                this.$Notice.error({ title: '', desc: '批量添加失败,' + response.info });
                return;
            }
            this.load({});
            this.$emit('addbatch', null);
        }).catch((response: any) => {
            if (response && response.status === 401) {
                return;
            }
            this.$Notice.error({ title: '', desc: '批量添加失败' });
        });  -->
    }

    /**
     * 数据导入
     *
     * @param {*} data
     * @memberof ${srfclassname(ctrl.codeName)}
     */
     public importExcel(data:any ={}):void{
        //导入excel
        const importDataModel:any ={
        <#if ctrl.getPSDEDataImport?? && ctrl.getPSDEDataImport()??>
        <#assign dataImport = ctrl.getPSDEDataImport() />
            importId:'${dataImport.getCodeName()}',
            serviceName:'${dataImport.getPSAppDataEntity().getCodeName()?lower_case}',
            appDeLogicName:'${dataImport.getPSAppDataEntity().getLogicName()}',
            importData:{
            <#if dataImport.getPSDEDataImportItems()??>
            <#list dataImport.getPSDEDataImportItems() as dataImportItem>
            "${dataImportItem.getName()}":{<#if dataImportItem.getPSCodeList()??><#assign codelist = dataImportItem.getPSCodeList()/>"codelist":{"type":"${codelist.getCodeListType()}","tag":"${codelist.getCodeName()}","isnumber":${codelist.isCodeItemValueNumber()?c}},</#if>"headername":"${dataImportItem.getCaption()}","isuniqueitem":${dataImportItem.isUniqueItem()?c},<#if dataImportItem.getPSAppDEField()??><#assign appDeField = dataImportItem.getPSDEField()/>"name":"${appDeField.getCodeName()?lower_case}","order":<#if appDeField.getImportOrder()??>${appDeField.getImportOrder()?c}</#if></#if>}<#if dataImportItem_has_next>,</#if>
            </#list>
            </#if>
            }
        </#if>
        }
        if(Object.keys(importDataModel).length == 0){
            this.$Notice.warning({ 'title': (this.$t("app.utilview.warning") as string), 'desc': (this.$t("app.utilview.info") as string) });
            return;
        }
        const view:any ={
            viewname: 'app-data-upload',
            title: this.$t("app.utilview.importview"),
            width: 900,
            height: 700
        }
        let container: Subject<any> = this.$appmodal.openModal(view, JSON.parse(JSON.stringify(this.context)), importDataModel);
        container.subscribe((result: any) => {
          if(Object.is(result.ret,'OK')){
            this.refresh(result.datas);
          }
      });
    }

<#assign hasDEExport = false />
<#if ctrl.getPSDEDataExport?? && ctrl.getPSDEDataExport()??>
  <#assign hasDEExport = true />
    /**
     * 所有导出列成员
     *
     * @type {any[]}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public allExportColumns: any[] = [
        <#if ctrl.getPSDEDataExport().getPSDEDataExportItems()??>
        <#list ctrl.getPSDEDataExport().getPSDEDataExportItems() as column>
        {
            name: '${column.getName()?lower_case}',
            label: '${column.getCaption()}',
            langtag: '<#if langbase??>${langbase}.exportColumns.${column.getName()?lower_case}</#if>',
            show: true,
        },
        </#list>
        </#if>
    ]

</#if>

    /**
     * 数据导出
     *
     * @param {*} data
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public exportExcel(data: any = {}): void {
        // 导出Excel
        const doExport = async (_data:any) => {
            const tHeader: Array<any> = [];
            const filterVal: Array<any> = [];
<#if hasDEExport>
            this.allExportColumns.forEach((item: any) => {
<#else>
            this.allColumns.forEach((item: any) => {
</#if>
              item.show && item.label ? tHeader.push(this.$t(item.langtag)) : "";
              item.show && item.name ? filterVal.push(item.name) : "";
            });
            const data = await this.formatExcelData(filterVal, _data);
            this.$export.exportExcel().then((excel:any)=>{
                excel.export_json_to_excel({
                  header: tHeader, //表头 必填
                  data, //具体数据 必填
                  filename: "${ctrl.getPSAppDataEntity().getLogicName()}表", //非必填
                  autoWidth: true, //非必填
                  bookType: "xlsx" //非必填
                });
            }); 
        };
        const page: any = {};
        // 设置page，size
        if (Object.is(data.type, 'maxRowCount')) {
            Object.assign(page, { page: 0, size: data.maxRowCount });
        } else if (Object.is(data.type, 'activatedPage')) {
<#if hasDEExport>
            Object.assign(page, { page: this.curPage-1, size: this.limit });
<#else>
            try {
                doExport(JSON.parse(JSON.stringify(this.items)));
            } catch (error) {
                console.error(error);
            }
            return;
</#if>
        }
        // 设置排序
        if (!this.isNoSort && !Object.is(this.minorSortDir, '') && !Object.is(this.minorSortPSDEF, '')) {
          const sort: string = this.minorSortPSDEF+","+this.minorSortDir;
            Object.assign(page, { sort: sort });
        }
        const arg: any = {};
        Object.assign(arg, page);
        // 获取query,搜索表单，viewparams等父数据
        const parentdata: any = {};
        this.$emit('beforeload', parentdata);
        Object.assign(arg, parentdata);
<#if hasDEExport>
        const post: Promise<any> = this.service.searchDEExportData(this.fetchAction,JSON.parse(JSON.stringify(this.context)), arg, this.showBusyIndicator);
<#else>
        const post: Promise<any> = this.service.search(this.fetchAction,JSON.parse(JSON.stringify(this.context)), arg, this.showBusyIndicator);
</#if>
        post.then((response: any) => {
            if (!response || response.status !== 200) {
                this.$Notice.error({ title: '', desc: '数据导出失败,' + response.info });
                return;
            }
            try {
                doExport(JSON.parse(JSON.stringify(response.data)));
            } catch (error) {
                console.error(error);
            }
        }).catch((response: any) => {
            if (response && response.status === 401) {
                return;
            }
            this.$Notice.error({ title: '', desc: '数据导出失败' });
        });
    }


    /**
     * 导出数据格式化
     * 
     * @param {*} filterVal
     * @param {*} jsonData
     * @returns {[]}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public async formatExcelData(filterVal:any, jsonData:any) {
        let codelistColumns:Array<any> = [
<#if hasDEExport>
  <#assign exportItems = ctrl.getPSDEDataExport().getPSDEDataExportItems() />
<#else>
  <#assign exportItems = ctrl.getAllPSDEGridColumns() />
</#if>
<#if exportItems??>
  <#list exportItems as column>
    <#if (hasDEExport || (!column.isHideDefault() && column.getName() != '')) && column.getCodeList?? && column.getCodeList()?? && column.getCLConvertMode() == 'FRONT'>
      <#assign codelist = column.getPSCodeList()>
      <#if codelist.getCodeListType() == 'STATIC' || codelist.getCodeListType() == 'DYNAMIC'>
          {
            name: '${column.getName()?lower_case}',
            srfkey: '${codelist.codeName}',
            codelistType : '${codelist.getCodeListType()}',
          <#if codelist.getOrMode() == 'STR'>
            textSeparator: '${codelist.textSeparator}',
            renderMode: 'string',
            valueSeparator: "${codelist.valueSeparator}",
          <#elseif codelist.getOrMode() == 'NUM'>
            renderMode: 'number',
            textSeparator: '${codelist.textSeparator}',
            valueSeparator: ',',
          <#else>
            renderMode: 'other',
            textSeparator: '、',
            valueSeparator: ',',
          </#if>
          },
      </#if>
    </#if>
  </#list>
</#if>
        ];
        let _this = this;
        for (const codelist of codelistColumns) {
          // 动态代码表处理
          if (Object.is(codelist.codelistType, "DYNAMIC")) {
              let items = await _this.codeListService.getItems(codelist.srfkey);
              jsonData.forEach((row:any)=>{
                  row[codelist.name] = _this.getCodelistValue(items, row[codelist.name], codelist);
              });
          // 静态处理
          } else if(Object.is(codelist.codelistType, "STATIC")){
              let items = await _this.$store.getters.getCodeListItems(codelist.srfkey);
              jsonData.forEach((row:any)=>{
                  row[codelist.name] = _this.getCodelistValue(items, row[codelist.name], codelist);
              });
          }
        }
        return jsonData.map((v:any) => filterVal.map((j:any) => v[j]))
    }   


    /**
     * 解析代码表和vlaue，设置items
     *
     * @public
     * @param {any[]} items 代码表数据
     * @param {*} value
     * @returns {*}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public getCodelistValue(items: any[], value: any, codelist: any,){
        if(!value){
            return this.$t('codelist.'+codelist.srfkey+'.empty');
        }
        if (items) {
            let result:any = [];
            if(Object.is(codelist.renderMode,"number")){
                items.map((_item: any, index: number)=>{
                    const nValue = parseInt((value as any), 10);
                    const codevalue = _item.value;
                    if((parseInt(codevalue, 10) & nValue) > 0){
                        result.push(_item);
                    } 
                });
            } else if(Object.is(codelist.renderMode,"string")){
                const arrayValue: Array<any> = (value as any).split(codelist.valueSeparator);
                arrayValue.map((value: any, index: number) => {
                    result.push([]);
                    let values: any[] = Object.is(this.$util.typeOf(value), 'number') ? [value] : [...(value as any).split(codelist.valueSeparator)];
                    values.map((val:any ,num: number)=>{
                        const item = this.getItem(items, val, codelist); 
                        if(item){
                          result[index].push(item);
                        } 
                    });
                });
            } else {
                let values: any[] = Object.is(this.$util.typeOf(value), 'number') ? [value] : [...(value as any).split(codelist.valueSeparator)];
                values.map((value:any ,index: number)=>{
                    const item = this.getItem(items, value, codelist); 
                    if(item){
                      result.push(item);
                    } 
                });
            }
            // 设置items
            if(result.length != 0){
              return result.join(codelist.valueSeparator);
            }else{
              return value;
            }
        }
    }

    /**
     * 获取代码项
     *
     * @public
     * @param {any[]} items
     * @param {*} value
     * @returns {*}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public getItem(items: any[], value: any, codelist: any): any {
        const arr: Array<any> = items.filter(item => {return item.value == value});
        if (arr.length !== 1) {
            return undefined;
        }
        if(Object.is(codelist.codelistType,'STATIC')){
            return this.$t('codelist.'+codelist.srfkey+'.'+arr[0].value);
        }else{
            return arr[0].text;
        }
    }

    /**
     * 生命周期
     *
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public created(): void {
        this.afterCreated();
        this.$acc.commandLocal(() => {
            this.load()
        }, 'all', '${ctrl.getPSAppDataEntity().getName()}');
    }

    /**
     * 执行created后的逻辑
     *
     *  @memberof ${srfclassname(ctrl.codeName)}
     */    
    public afterCreated(){
        this.readyDCodelist();
        this.setColState();
        if (this.viewState) {
            this.viewStateEvent = this.viewState.subscribe(({ tag, action, data }) => {
                if (!Object.is(tag, this.name)) {
                    return;
                }
                if (Object.is('load', action)) {
                    this.load(data);
                }
                if (Object.is('remove', action)) {
                    this.remove(data);
                }
                if (Object.is('save', action)) {
                    this.save(data);
                }
            });
        }
    }

    /**
     * vue 生命周期
     *
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public destroyed() {
        this.afterDestroy();
    }

    /**
     * 执行destroyed后的逻辑
     *
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public afterDestroy() {
        if (this.viewStateEvent) {
            this.viewStateEvent.unsubscribe();
        }
        <#if destroyed_block??>
        ${destroyed_block}
        </#if>
    }

    /**
     * 获取选中行胡数据
     *
     * @returns {any[]}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public getSelection(): any[] {
        return this.selections;
    }

    /**
     * 行双击事件
     *
     * @param {*} $event
     * @returns {void}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public rowDBLClick($event: any): void {
        if (!$event || this.actualIsOpenEdit || Object.is(this.gridRowActiveMode,0)) {
            return;
        }
        this.selections = [];
        this.selections.push(JSON.parse(JSON.stringify($event)));

        const refs: any = this.$refs;
        if (refs.multipleTable) {
            refs.multipleTable.clearSelection();
            refs.multipleTable.toggleRowSelection($event);
        }

        this.$emit('rowdblclick', this.selections);
        this.$emit('selectionchange', this.selections);
    }

    /**
     * 复选框数据选中
     *
     * @param {*} $event
     * @returns {void}
     * @memberof  ${srfclassname(ctrl.codeName)}
     */
    public select($event: any): void {
        if (!$event) {
            return;
        }
        this.selections = [];
        this.selections = [...JSON.parse(JSON.stringify($event))];
        this.$emit('selectionchange', this.selections);
    }

    /**
     * 复选框数据全部选中
     *
     * @param {*} $event
     * @memberof  ${srfclassname(ctrl.codeName)}
     */
    public selectAll($event: any): void {
        if (!$event) {
            return;
        }
        this.selections = [];
        this.selections = [...JSON.parse(JSON.stringify($event))];
        this.$emit('selectionchange', this.selections);
    }

    
    /**
     * 行单击选中
     *
     * @param {*} $event
     * @returns {void}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public rowClick($event: any, ifAlways: boolean = false): void {
        if (!ifAlways && (!$event || this.actualIsOpenEdit)) {
            return;
        }
        if(this.stopRowClick) {
            this.stopRowClick = false;
            return;
        }
        if(this.isSingleSelect){
            this.selections = [];
        }
        // 已选中则删除，没选中则添加
        let selectIndex = this.selections.findIndex((item:any)=>{
            return Object.is(item.${ctrl.getPSDataEntity().getName()?lower_case},$event.${ctrl.getPSDataEntity().getName()?lower_case});
        });
        if (Object.is(selectIndex,-1)){
          this.selections.push(JSON.parse(JSON.stringify($event)));
        } else {
          this.selections.splice(selectIndex,1);
        }

        const refs: any = this.$refs;
        if (refs.multipleTable) {
            if(this.isSingleSelect){
                refs.multipleTable.clearSelection();
                refs.multipleTable.setCurrentRow($event);
            }else{
                refs.multipleTable.toggleRowSelection($event); 
            }
        }

        this.$emit('selectionchange', this.selections);
    }


    /**
     * 页面变化
     *
     * @param {*} $event
     * @returns {void}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public pageOnChange($event: any): void {
        if (!$event) {
            return;
        }
        if ($event === this.curPage) {
            return;
        }
        this.curPage = $event;
        this.load({});
    }

    /**
     * 分页条数变化
     *
     * @param {*} $event
     * @returns {void}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public onPageSizeChange($event: any): void {
        if (!$event) {
            return;
        }
        if ($event === this.limit) {
            return;
        }
        this.limit = $event;
        if (this.curPage === 1) {
            this.load({});
        }
    }

    /**
     * 分页刷新
     *
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public pageRefresh(): void {
        this.load({});
    }

    /**
     * 排序变化
     *
     * @param {{ column: any, prop: any, order: any }} { column, prop, order }
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public onSortChange({ column, prop, order }: { column: any, prop: any, order: any }): void {
        const dir = Object.is(order, 'ascending') ? 'asc' : Object.is(order, 'descending') ? 'desc' : '';
        if (Object.is(dir, this.minorSortDir) && Object.is(this.minorSortPSDEF, prop)) {
            return;
        }
        this.minorSortDir = dir;
        this.minorSortPSDEF = prop ? prop : '';
        this.load({});
    }

    /**
     * 表格行选中样式
     *
     * @param {{ row: any, rowIndex: any }} { row, rowIndex }
     * @returns {string}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public onRowClassName({ row, rowIndex }: { row: any, rowIndex: any }): string {
        const index = this.selections.findIndex((select: any) => Object.is(select.srfkey, row.srfkey));
        return index !== -1 ? 'grid-row-select' : '';
    }

<#if ctrl.getAggMode() != "NONE">
    /**
     * 合计行绘制
     *
     * @param {any} param
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public getSummaries(param:any){
    <#if ctrl.getAggMode() == "PAGE">
        const { columns, data } = param;
        const sums:Array<any> = [];
        columns.forEach((column:any, index:number) => {
          if (index === 0) {
            sums[index] = '合计';
            return;
          }
          if(index === (columns.length - 1)){
            sums[index] = '';
            return;
          }
          const values = data.map((item:any) => Number(item[column.property]));
          if (!values.every((value:any) => isNaN(value))) {
            <#if ctrl.getPSDEGridColumns()??>
            <#list ctrl.getPSDEGridColumns() as singleColumn>
            <#if singleColumn.getAggMode() == "SUM">
                if(Object.is(column.property,'${singleColumn.getCodeName()?lower_case}')){
                    let tempData = values.reduce((prev:any, curr:any) => {
                        const value = Number(curr);
                        if (!isNaN(value)) {
                            return prev + curr;
                        } else {
                            return prev;
                        }
                    }, 0);
                    sums[index] = tempData;
                }
            <#elseif singleColumn.getAggMode() == "AVG">
                if(Object.is(column.property,'${singleColumn.getCodeName()?lower_case}')){
                    let tempData = values.reduce((prev:any, curr:any) => {
                        const value = Number(curr);
                        if (!isNaN(value)) {
                            return prev + curr;
                        } else {
                            return prev;
                        }
                    }, 0);
                    sums[index] = tempData/data.length;
                }
            <#elseif singleColumn.getAggMode() == "MAX">
                if(Object.is(column.property,'${singleColumn.getCodeName()?lower_case}')){
                    let tempData:any;
                    values.forEach((item:any) =>{
                    const value = Number(item);
                        if (!isNaN(value)) {
                            if(!tempData){
                                tempData = value;
                            }
                            if(value > tempData){
                                tempData = value;
                            }
                        }
                    });
                    sums[index] = tempData;
                }
            <#elseif singleColumn.getAggMode() == "MIN">
                if(Object.is(column.property,'${singleColumn.getCodeName()?lower_case}')){
                    let tempData:any;
                    values.forEach((item:any) =>{
                    const value = Number(item);
                        if (!isNaN(value)) {
                            if(!tempData){
                                tempData = value;
                            }
                            if(value < tempData){
                                tempData = value;
                            }
                        }
                    });
                    sums[index] = tempData;
                }
            </#if>
            </#list>
            </#if>
          } else {
            sums[index] = 'N/A';
          }
        });
        return sums;
    <#elseif ctrl.getAggMode() == "ALL">
        const { columns } = param;
        const sums:Array<any> = [];
        columns.forEach((column:any, index:number) => {
        if (index === 0) {
            sums[index] = '合计';
            return;
        }else if(index === (columns.length - 1)){
            sums[index] = '';
            return;
        }else{
        <#if ctrl.getPSDEGridColumns()??>
            sums[index] = 'N/A';
        <#list ctrl.getPSDEGridColumns() as singleColumn>
            <#if singleColumn.getAggMode() != "NONE">
            if(Object.is(column.property,'${singleColumn.getCodeName()?lower_case}')){
                const value = Number(this.remoteData.${singleColumn.getCodeName()?lower_case});
                if (!isNaN(value)) {
            <#if singleColumn.getAggMode() == "SUM">
                    sums[index] =  value;
            <#elseif singleColumn.getAggMode() == "AVG">
                    sums[index] =  value;
            <#elseif singleColumn.getAggMode() == "MAX">
                    sums[index] =  value;
            <#elseif singleColumn.getAggMode() == "MIN">
                    sums[index] =  value;
            </#if>
                }
            }
            </#if>
        </#list>
        </#if>
        }
        });
        return sums; 
    </#if>
      }
</#if>

<#if ctrl.getAggMode() == "ALL">
    /**
     * 远程获取合计行数据
     *
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public getAggData(){
        this.service.getAggData(this.aggAction,JSON.parse(JSON.stringify(this.context)),this.showBusyIndicator).then((response:any) =>{
            if (!response.status || response.status !== 200) {
                if (response.errorMessage) {
                    this.$Notice.error({ title: '错误', desc: response.errorMessage });
                }
                return;
            }
            this.remoteData = response.data;
            this.isDisplay = true;
        }).catch((response:any) =>{
            if (response && response.status === 401) {
                return;
            }
            this.remoteData = {};
            this.isDisplay = true;
            this.$Notice.error({ title: '错误', desc: response.errorMessage });
        })
    }
</#if>

    /**
     * 界面行为
     *
     * @param {*} row
     * @param {*} tag
     * @param {*} $event
     * @memberof ${srfclassname(ctrl.codeName)}
     */
	public uiAction(row: any, tag: any, $event: any) {
        <#--  this.rowClick(row, true);  -->
        $event.stopPropagation();
        <#if ctrl.getPSAppViewLogics()??>
        <#list ctrl.getPSAppViewLogics() as logic>
        <#if logic.getPSAppViewUIAction().getPSUIAction()??>
        <#assign action = logic.getPSAppViewUIAction().getPSUIAction()>
        if(Object.is('${action.getUIActionTag()}', tag)) {
            this.${logic.getName()}(row, tag, $event);
        }
        </#if>
        </#list>
        </#if>
    }

    /**
     * 设置列状态
     *
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public setColState() {
		const _data: any = localStorage.getItem('${ctrl.getPSDataEntity().getName()?lower_case}_${ctrl.getCodeName()?lower_case}_${ctrl.name}');
		if (_data) {
			let columns = JSON.parse(_data);
			columns.forEach((col: any) => {
				let column = this.allColumns.find((item) => Object.is(col.name, item.name));
				if (column) {
					Object.assign(column, col);
				}
			});
		}
    }

    /**
     * 列变化
     *
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public onColChange() {
        localStorage.setItem('${ctrl.getPSDataEntity().getName()?lower_case}_${ctrl.getCodeName()?lower_case}_${ctrl.name}', JSON.stringify(this.allColumns));
    }

    /**
     * 获取列状态
     *
     * @param {string} name
     * @returns {boolean}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public getColumnState(name: string): boolean {
        let column = this.allColumns.find((col: any) =>
            Object.is(name, col.name)
        );
        return column.show ? true : false;
    }

    /**
     * 表格列是否自适应布局
     *
     * @readonly
     * @type {boolean}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    get adaptiveState(): boolean {
        return !this.allColumns.find((column: any) => column.show && Object.is(column.util, 'STAR'));
    }

    /**
     * 保存
     *
     * @param {*} $event
     * @returns {Promise<any>}
     * @memberof ${srfclassname('${ctrl.codeName}')}
     */
    public async save(args: any[], params?: any, $event?: any, xData?: any){
        let _this = this;
        if(!await this.validateAll()){
            this.$Notice.error({ title: '错误', desc: '值规则校验异常' });
            return [];
        }
        let successItems:any = [];
        let errorItems:any = [];
        let errorMessage:any = [];
        for (const item of _this.items) {
            try {
                if(Object.is(item.rowDataState, 'create')){
                    if(!this.createAction){
                        this.$Notice.error({ title: '错误', desc: '${view.getName()}视图表格createAction参数未配置' });
                    }else{
                      Object.assign(item,{viewparams:this.viewparams});
                      let response = await this.service.add(this.createAction, JSON.parse(JSON.stringify(this.context)),item, this.showBusyIndicator);
                      successItems.push(JSON.parse(JSON.stringify(response.data)));
                    }
                }else if(Object.is(item.rowDataState, 'update')){
                    if(!this.updateAction){
                        this.$Notice.error({ title: '错误', desc: '${view.getName()}视图表格updateAction参数未配置' });
                    }else{
                        Object.assign(item,{viewparams:this.viewparams});
<#if de??>
                        if(item.${appde.getCodeName()?lower_case}){
                            Object.assign(this.context,{${appde.getCodeName()?lower_case}:item.${appde.getCodeName()?lower_case}});
                        }
</#if>
                        let response = await this.service.add(this.updateAction,JSON.parse(JSON.stringify(this.context)),item, this.showBusyIndicator);
                        successItems.push(JSON.parse(JSON.stringify(response.data)));
                    }
                }
            } catch (error) {
                errorItems.push(JSON.parse(JSON.stringify(item)));
                errorMessage.push(error);
            }
        }
        this.$emit('save', successItems);
        this.refresh([]);
        if(errorItems.length === 0){
            this.$Notice.success({ title: '', desc: '保存成功!' });
        }else{
          errorItems.forEach((item:any,index:number)=>{
            this.$Notice.error({ title: '保存失败', desc: item.majorentityname+'保存失败！' });
            console.error(errorMessage[index]);
          });
        }
        return successItems;
    }

<#if ctrl.isEnableRowEdit()>
    /**
     * 新建行
     *
     * @param {*} $event
     * @returns {void}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public newRow(args: any[], params?: any, $event?: any, xData?: any): void {
        if(!this.loaddraftAction){
            this.$Notice.error({ title: '错误', desc: '${view.getName()}视图表格loaddraftAction参数未配置' });
            return;
        }
        let _this = this;
        Object.assign(args[0],{viewparams:this.viewparams});
        let post: Promise<any> = this.service.loadDraft(this.loaddraftAction, JSON.parse(JSON.stringify(this.context)), args[0], this.showBusyIndicator);
        post.then((response: any) => {
            if (!response.status || response.status !== 200) {
                if (response.errorMessage) {
                    this.$Notice.error({ title: '错误', desc: response.errorMessage });
                }
                return;
            }
            const data = response.data;
            this.createDefault(data);
            data.rowDataState = "create";
            _this.items.push(data);
            _this.gridItemsModel.push(_this.getGridRowModel());
        }).catch((response: any) => {
            if (response && response.status === 401) {
                return;
            }
            if (!response || !response.status || !response.data) {
                this.$Notice.error({ title: '错误', desc: '系统异常' });
                return;
            }
        });
    }

    /**
     * 表格编辑项值变更
     *  
     * @param row 行数据
     * @param {{ name: string, value: any }} $event
     * @returns {void}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public onGridItemValueChange(row: any,$event: { name: string, value: any },rowIndex: number): void {
        if (!$event) {
            return;
        }
        if (!$event.name || Object.is($event.name, '') || !row.hasOwnProperty($event.name)) {
            return;
        }
        row[$event.name] = $event.value;
        this.gridEditItemChange(row, $event.name, $event.value, rowIndex);
    }

    /**
     * 表格编辑项值变化
     *
     * @public
     * @param row 行数据
     * @param property 列编辑项名
     * @param row 列编辑项值
     * @returns {void}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public gridEditItemChange(row: any, property: string, value: any, rowIndex: number){
        row.rowDataState = row.rowDataState ? row.rowDataState : "update" ;
        this.validate(property,row,rowIndex);
  <#if ctrl.getPSDEGridEditItems()??>
    <#list ctrl.getPSDEGridEditItems() as editItem>
      <#if editItem.getPSDEGridEditItemUpdate()??>
      <#assign itemUpdate=editItem.getPSDEGridEditItemUpdate()/>
        if(Object.is(property, '${editItem.name}')){
            const details: string[] = [<#list itemUpdate.getPSDEGEIUpdateDetails() as detail><#if detail_index gt 0>, </#if>'${detail.getPSDEGridColumnName()?lower_case}'</#list>];
            this.updateGridEditItem('${itemUpdate.codeName}', row, details, ${itemUpdate.isShowBusyIndicator()?c});
        }
      </#if>
    </#list>
  </#if>
    }

    /**
     * 表格编辑项更新
     *
     * @param {string} mode 界面行为名称
     * @param {*} [data={}] 请求数据
     * @param {string[]} updateDetails 更新项
     * @param {boolean} [showloading] 是否显示加载状态
     * @returns {void}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public updateGridEditItem(mode: string, data: any = {}, updateDetails: string[], showloading?: boolean): void {
        if (!mode || (mode && Object.is(mode, ''))) {
            return;
        }
        const arg: any = JSON.parse(JSON.stringify(data));
        Object.assign(arg,{viewparams:this.viewparams});
        const post: Promise<any> = this.service.frontLogic(mode,JSON.parse(JSON.stringify(this.context)),arg, showloading);
        post.then((response: any) => {
            if (!response || response.status !== 200) {
                this.$Notice.error({ title: '错误', desc: '表单项更新失败' });
                return;
            }
            const _data: any = response.data;
            if(!_data){
                return;
            }
            updateDetails.forEach((name: string) => {
                if (!_data.hasOwnProperty(name)) {
                    return;
                }
                data[name] = _data[name];
            });
        }).catch((response: any) => {
            if (response && response.status === 401) {
                return;
            }
            if (!response || !response.status || !response.data) {
                this.$Notice.error({ title: '错误', desc: '系统异常' });
                return;
            }
        });
    }
</#if>

    /**
     * 获取对应行class
     *
     * @param {*} $args row 行数据，rowIndex 行索引
     * @returns {void}
     * @memberof ${srfclassname(ctrl.codeName)}
     */
    public getRowClassName(args:{row: any,rowIndex: number}){
        let isSelected = this.selections.some((item:any)=>{
            return Object.is(item.${appde.getCodeName()?lower_case},args.row.${appde.getCodeName()?lower_case});
        });
        return isSelected ? "grid-selected-row" : "";
    }

    /**
     * 新建默认值
     * @param {*}  row 行数据
     * @memberof ${srfclassname('${ctrl.codeName}')}
     */
    public createDefault(row: any){                    
        <#list ctrl.getPSDEGridEditItems() as editItem><#t>
        <#if editItem.getCreateDV?? && editItem.getCreateDV()??><#t>
        <#if !(editItem.getCreateDV() == '')><#t>
        if (row.hasOwnProperty('${editItem.getCodeName()?lower_case}')) {
        <#-- 网页请求 -->
        <#if editItem.getCreateDVT() == 'CONTEXT'>
            row['${editItem.getCodeName()?lower_case}'] = this.viewparams['${editItem.getCreateDV()}'];
        <#-- 用户全局对象 -->
        <#elseif editItem.getCreateDVT() == 'SESSION'>
            row['${editItem.getCodeName()?lower_case}'] = this.context['${editItem.getCreateDV()}'];
         <#-- 当前应用数据 -->
        <#elseif editItem.getCreateDVT() == 'APPDATA'>
            row['${editItem.getCodeName()?lower_case}'] = this.context['${editItem.getCreateDV()}'];
        <#-- 当前操作用户(名称) -->
        <#elseif editItem.getCreateDVT() == 'OPERATORNAME'>
            row['${editItem.getCodeName()?lower_case}'] = this.context['srfusername'];
        <#-- 当前操作用户(编号) -->
        <#elseif editItem.getCreateDVT() == 'OPERATOR'>
            row['${editItem.getCodeName()?lower_case}'] = this.context['srfuserid'];
        <#else>
        <#-- 默认值 -->
            <#assign datatype=srfjavatype(editItem.getPSAppDEField().getStdDataType())>
            row['${editItem.getCodeName()?lower_case}'] = <#if datatype=='BigInteger' || datatype=='Integer' || datatype=='Double' || datatype=='Decimal' || datatype=='Float' || datatype=='BigDecimal'>${editItem.getCreateDV()}<#else>'${editItem.getCreateDV()}'</#if>;
        </#if>
        }
        </#if>
        </#if>
        </#list>
    }
<#ibizinclude>
../@MACRO/CONTROL/CONTROL_BOTTOM-BASE.vue.ftl
</#ibizinclude>